package com.architecture.view;

import java.util.ArrayList;
import java.util.List;

import org.primefaces.context.RequestContext;

import com.archtecture.control.enums.TipoOrdenacao;
import com.archtecture.control.exceptions.NegocioException;
import com.archtecture.control.models.ModelAb;

public abstract class PadraoManutencaoMB<Model extends ModelAb> extends PadraoMBAb {

	private List<Model> listModel;

	private Model modelCad;

	private Model modelSel;

	private boolean pesquisaRealizada;

	public void executarExcluir(Model pModel) {

		try {
			getPersistenceFacade().excluir(pModel);
			UtilWeb.enviarMensagem(MensagemEnum.INFO_SUCESSO_EXCLUSAO);

			setListModel(null);
			setModelCad(null);

			if (isPesquisaRealizada()) {
				executarPesquisar();
			}
		}
		catch (Exception e) {
			UtilWeb.tratarException(e);
		}
	}

	public void executarPesquisar() {
		try {
			setListModel(getPersistenceFacade().pesquisarLista(getModelSel(), getTipoOrdenacao(), getAtributosOrdenacao()));

			if (getListModel().isEmpty()) {
				UtilWeb.enviarMensagem(MensagemEnum.INFO_PESQUISA_VAZIA);
			}

			pesquisaRealizada = true;
		}
		catch (NegocioException e) {
			UtilWeb.tratarException(e);
		}
	}

	protected TipoOrdenacao getTipoOrdenacao() {
		return TipoOrdenacao.ASC;
	}

	protected String[] getAtributosOrdenacao() {
		return getModelSel().getAtributosOrdencao();
	}

	public void executarSalvar() {

		try {

			// FIXME Produto nao cadastra verificar annotarion
			
			if (getModelCad().getCodigo() == null || getModelCad().getCodigo().equals(0)) {
				prepararSalvar();
				getPersistenceFacade().inserir(getModelCad());
				UtilWeb.enviarMensagem(MensagemEnum.INFO_SUCESSO_CADASTRO);
			}
			else {
				prepararEditar();
				getPersistenceFacade().atualizar(getModelCad());
				UtilWeb.enviarMensagem(MensagemEnum.INFO_SUCESSO_EDICAO);
			}
			
			aposSalvar();

			setListModel(null);
			setModelCad(null);

			if (isPesquisaRealizada()) {
				executarPesquisar();
			}

			RequestContext.getCurrentInstance().execute("PF('dialogCadastro').hide()");
		}
		catch (NegocioException e) {
			UtilWeb.tratarException(e);
		}
	}

	protected void prepararSalvar() throws NegocioException {

	}

	protected void prepararEditar() throws NegocioException {

	}

	protected abstract Model getInstance();

	public List<Model> getListModel() {
		if (listModel == null) {
			listModel = new ArrayList<>();
		}
		return listModel;
	}

	public Model getModelCad() {
		if (modelCad == null) {
			modelCad = getInstance();
		}
		return modelCad;
	}

	public Model getModelSel() {
		if (modelSel == null) {
			modelSel = getInstance();
		}
		return modelSel;
	}

	public void prepararDetalhes(Model pModel) {
		setModelCad(pModel);
		RequestContext.getCurrentInstance().execute("PF('dialogDetalhes').show()");
	}

	public void prepararEditar(Model pModel) {
		setModelCad(pModel);
		RequestContext.getCurrentInstance().execute("PF('dialogCadastro').show()");
	}

	public void setListModel(List<Model> listModel) {
		this.listModel = listModel;
	}

	public void setModelCad(Model modelCad) {
		this.modelCad = modelCad;
	}

	public void setModelSel(Model modelSel) {
		this.modelSel = modelSel;
	}

	public boolean isPesquisaRealizada() {
		return pesquisaRealizada;
	}

	@SuppressWarnings("rawtypes")
	protected List montarCombo(ModelAb pModel, TipoOrdenacao pTipoOrdenacao, String... pAtributosOrdenacao) {

		List<ModelAb> listCombo = new ArrayList<ModelAb>();

		try {
			listCombo = getPersistenceFacade().pesquisarLista(pModel, pTipoOrdenacao, pAtributosOrdenacao);
		}
		catch (NegocioException e) {
			UtilWeb.tratarException(e);
		}
		
		return listCombo;
	}

	protected void aposSalvar() throws NegocioException {
		
	}

}
